/**
 * Clase que representa a una Fecha. 
 * @author Castellina, Marmol, Pautasso, Varela
 * @version 1.0
 */
public class Fecha {
	
	Integer dia;
	Integer mes;
	Integer anio;
	
	/**
	 * @brief Constructor con parametros de la clase Fecha.
	 * Crea un Objeto del tipo Fecha con el dia, mes y anio pasados como parametro.
	 * @note el anio debe tomar valores mayores a 0.
	 * @param dia Valor del dia correspondiente a la Fecha creada.
	 * @param mes Valor del mes correspondientes a la Fecha creada.
	 * @param anio Valor del anio correspondientes a la Fecha creada.
	 */
	public Fecha(Integer dia, Integer mes, Integer anio) {
		super();
		this.dia = dia;
		this.mes = mes;
		this.anio = anio;
	}
	/**
	 * @brief Retorna el valor del dia.
	 * Metodo que retorna el valor del dia de la correspondiente Fecha.
	 * @return dia correspondiente a la Fecha.
	 */
	public Integer getDia() {
		return dia;
	}
	/**
	 * @brief Setea el valor del dia
	 * Metodo que setea el valor del dia de la Fecha correspondiente.
	 * @param dia es el valor a setear.
	 */
	public void setDia(Integer dia) {
		this.dia = dia;
	}
	/**
	 * @brief Retorna el valor del mes.
	 * Metodo que retorna el valor del mes de la correspondiente Fecha.
	 * @return mes correspondiente a la Fecha.
	 */
	public Integer getMes() {
		return mes;
	}
	/**
	 * @brief Setea el valor del mes
	 * Metodo que setea el valor del mes de la Fecha correspondiente.
	 * @param mes es el valor a setear.
	 */
	public void setMes(Integer mes) {
		this.mes = mes;
	}
	/**
	 * @brief Retorna el valor de anio.
	 * Metodo que retorna el valor del anio de la correspondiente Fecha.
	 * @return anio correspondiente a la Fecha.
	 */
	public Integer getAnio() {
		return anio;
	}
	/**
	 * @brief Setea el valor de anio
	 * Metodo que setea el valor del anio de la Fecha correspondiente.
	 * @note el valor del anio a setear debe mayor a 0.
	 * @param minuto es el valor a setear.
	 */
	public void setAnio(Integer anio) {
		this.anio = anio;
	}
	
	/**
	 * @brief Retorna si un anio es bisiesto o no.
	 * Metodo que me retorna si el anio es bisiesto o no.
	 * @return bisiesto, retorna true si el anio es bisiesto, de lo contrario retorna false.
	 */
	 public boolean bisiesto (){
		 boolean bisiesto = (((anio % 4)==0) && ((anio / 100) != 0)) || (((anio / 100)==0) && ((anio / 400)==0));
		 return (bisiesto);	
	}
	   
	
	
	 /**
	  * @brief Reemplaza la fecha actual por el dia siguiente.
	  * Metodo que incrementa un dia a la fecha actual.
	  */
	 public void diaSiguiente(){
		 if (((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)) && (dia==31)){
			 dia=1;
			 mes++;
		 }
		 else{
			 if (((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)) && (dia<31)){
				 dia++;
			 }
			 else{
				 if (((mes==4)||(mes==6)||(mes==9)||(mes==11)) && (dia==30)){
					 dia = 1;
					 mes++;
				 }
				 else{
					 if (((mes==4)||(mes==6)||(mes==9)||(mes==11)) && (dia<30)){
						 dia++;
					 }
					 else{
						 if ((mes==2) && (dia==29)){
							 dia = 1;
							 mes++;
						 }
						 else{
							 if ((mes==2) && (dia<29)){
								 if (!bisiesto()){
									 if (dia == 28){
										 dia=1;
										 mes++;
									 }
									 else{
										 dia++;
									 }
								 }
								 else{
									 dia++;
								 }
							 }
							 else{
								 if ((mes==12) && (dia==31)){
									 dia = 1;
									 mes = 1;
									 anio++;
								 }
								 else{
									 if ((mes==12) && (dia<31)){
										 dia++;
									 }
								 }
							 }
						 }
					 }
				 }
			 }
		 }
	 }
	       
	       
	 /**
	  * @brief Devuelven si la Fecha actual y la pasada como parametro representan el mismo dia.
	  * Metodo que me permite comparar si dos fechas represemtam el mismo dia.
	  * @param fecha es la fecha a compara con la fecha actual.
	  * @return result, retorna true si la fecha actual representa el mismo dia que el pasado como parametro, de lo contrario retorna false.
	  */
	 public boolean equals(Fecha fecha){
		 boolean result = anio.equals(fecha.getAnio())&&mes.equals(fecha.getMes())&& dia.equals(fecha.getDia());
		 return (result);
	 }
	

	 /**
	  * @brief Traduce la Fecha a String
	  * Metodo que me permite obtener la Fechaa como un string.
	  * @return String la Fecha.
	  */
	 public String toString(){
		 return(dia+"/"+mes+"/"+anio);
	 }	
}
